/* Implementación del TDA Cadena */
#include <stdio.h>
#include <stdlib.h>
#include "../include/cadena.h"

Tcadena crearCadena(char* str)
{
	int k, len=0;
	for(k=0;*(str+k)!='\0';k++);
	len=k+1;
	Tcadena cad=(Tcadena) malloc(len);
	cad->str=(char*) malloc(len);
	if(cad!=NULL)
		for(k=0;k<len;k++)
			*((cad->str)+k)= *(str+k);
	return cad;
}

void destruirCadena(Tcadena cad)
{
	if(cad!=NULL)
		free(cad);
}

void imprimirCadena(Tcadena cad)
{
	if(cad!=NULL && cad->str!='\0')
		printf("%s\n",cad->str);
}

Tcadena cadenaVacia(void)
{
	char *str='\0';
	Tcadena cad=(Tcadena) malloc(1);
	cad->str=str;
	return cad;
}

void asignar(Tcadena cad, char* str)
{
	int k, len=0;
	for(k=0;*(str+k)!='\0';k++);
	len=k+1;
	cad=(Tcadena) realloc(cad, len);
	cad->str=(char*) realloc(cad->str, len);
	if(cad!=NULL)
		for(k=0;k<len;k++)
			*((cad->str)+k)=*(str+k);
}

int longitud(Tcadena cad)
{
	int len=0;
	if(cad!=NULL)
		for(len=0;*((cad->str)+len)!='\0';len++);
	return len;
}

int buscarCaracter(Tcadena cad, char c)
{
	int len=0;
	char *p=cad->str;
	if(cad!=NULL)
		for(len=0;(*(p+len)!='\0')&&(*(p+len)!=c);len++);
	if(*(p+len)==c)
		return ++len;
	else
		return -1;
}

Tcadena concatenar(Tcadena cad1, Tcadena cad2)
{
	if((cad1!=NULL)&&(cad2!=NULL))
	{
		int k, len1=longitud(cad1), len2=longitud(cad2);
		char *str=(char *) malloc(len1+len2+1);
		for(k=0;k<len1;k++)
			*(str+k)=*((cad1->str)+k);
		for(k=0;k<len2;k++)
			*(str+len1+k)=*((cad2->str)+k);
		Tcadena nuevaCad=crearCadena(str);
		return nuevaCad;
	}
}

Tcadena extraer(Tcadena cad, int ini, int cant)
{
	if(cad!=NULL)
	{
		int k;
		Tcadena nuevaCad=crearCadena("");
		char *str=(char *) malloc(cant+1);
		for(k=0;k<cant;k++)
			*(str+k)=*((cad->str)+ini-1+k);
		asignar(nuevaCad,str);
		return nuevaCad;
	}
}

void asignarCadena(Tcadena cad, Tcadena cad2)
{
	int k, len=0;
	char *str=cad2->str;
	for(k=0;*(str+k)!='\0';k++);
	len=k+1;
	cad=(Tcadena) realloc(cad, len);
	cad->str=(char*) realloc(cad->str, len);
	if(cad!=NULL)
		for(k=0;k<len;k++)
			*((cad->str)+k)=*(str+k);
}
